package com.shujia.scala

/**
 * scala中的特征trait：既可以像抽象类一样定义抽象或者是具体的方法及属性，也可以像接口一样同时可以实现多个
 *
 * Java中的抽象有两种定义形式：
 * 1、抽象类：abstract class
 * 2、接口：implement
 *
 * 抽象类中可以定义抽象的方法也可以定义具体的方法以及属性，如果子类存在父类，那么就无法再继承抽象类了
 *
 * 接口中只能定义抽象的方法，同一个类可以同时实现多个接口
 *
 */
class NewPerson(id: String, i: Int) {
  val _i: Int = i

  override def toString: String = {
    s"$id,$i"
  }
}

trait T1 {
  val name = "zs"

  def isEqual01(int: Int): Boolean

  def isNotEqual01(int: Int): Boolean = {
    !isEqual01(int)
  }
}


trait T2 {
  val xiaoName = "zz"

  def isEqual02(int: Int): Boolean

  def isNotEqual02(int: Int): Boolean = {
    !isEqual02(int)
  }
}

class MyClazz(id: String, i: Int) extends NewPerson(id, i) with T1 with T2 {

  override def isEqual01(int: Int): Boolean = {
    int == i
  }

  override def isEqual02(int: Int): Boolean = {
    int == i
  }
}

object Demo21Trait {
  def main(args: Array[String]): Unit = {
    val myClazz = new MyClazz("001", 20)
    println(myClazz.toString())
    println(myClazz.isEqual01(10))
    println(myClazz.isEqual02(20))

    val list: List[Int] = List[Nothing]()
    val list2: List[Byte] = List[Nothing]()
    val list3: List[Null] = List[Nothing]()
    val list4: List[String] = List[Nothing]()

    val nil: Nil.type = Nil
    println(nil)
  }

}
